#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define mp make_pair
#define all(s) (s).begin(),(s).end()
#define endl "\n"
#define pb push_back
#define eb emplace_back
#define ins insert
#define pq priority_queue

using ll=long long;
using ull=unsigned long long;
using db=long double;
using pii=pair<int, int>;
using pdd=pair<db, db>;

constexpr int inf=0x3f3f3f3f;
constexpr ll llinf=0x3f3f3f3f3f3f3f3fll;
constexpr int LEN=1000010;
constexpr db eps=1e-8;

struct Node
{
    int d, v, a;
    pii calc(int L, int V)
    {
        pdd res;
        if(a==0) res=(v<=V ? mp(L+1, L+1) : mp(d, L));
        if(a>0)
        {
            db st=(1.0*V*V-v*v)/(2.0*a)+d;
            if(st>L) res=mp(L+1, L+1);
            res=mp(st, L);
        }
        if(a<0)
        {
            if(v<=V) res=mp(L+1, L+1);
            db ed=min(1.0*L, (1.0*V*V-v*v)/(2.0*a)+d);
            res=mp(d, ed);
        }
        return mp(ceil(res.fi), floor(res.se));
    }
};
signed main()
{
    freopen("detect.in", "r", stdin);
    freopen("detect.out", "w", stdout);
    cin.tie(0)->sync_with_stdio(0);
    cin.exceptions(cin.failbit);
    int T; cin>>T;
    while(T--)
    {
        int n, m, L, V;
        cin>>n>>m>>L>>V;
        vector<Node> cars(n+1);
        vector<int> p(m+1);
        for(int i=1; i<=n; i++)
            cin>>cars[i].d>>cars[i].v>>cars[i].a;
        vector<int> cnt(LEN);
        vector<int> s(LEN);
        for(int i=1; i<=m; i++)
        {
            cin>>p[i];
            cnt[p[i]]++;
        }
        for(int i=1; i<LEN; i++)
            s[i]=cnt[i]+s[i-1];
        auto work=[&](pii seg){ return s[seg.se]-s[seg.fi-1]; };
        vector<pii> segs;
        for(int i=1; i<=n; i++)
        {
            pii seg=cars[i].calc(L, V);
            if(seg==mp(L+1, L+1)) continue;
            segs.eb(seg);
        }
        sort(all(segs));
        int ans1=0, ans2=0;
        for(auto seg: segs) ans1+=(work(seg)!=0);
        if(ans1==0)
        {
            cout<<0<<" "<<m<<endl;
            continue;
        }
        for(int i=1; i<=m; i++)
        {
            cnt[p[i]]--;
            for(int i=1; i<LEN; i++) s[i]=cnt[i]+s[i-1];
            int res=0;
            for(auto seg: segs) res+=(work(seg)!=0);
            if(res==ans1) ans2++;
            else cnt[p[i]]++;
        }
        // vector<pii> cand; cand.eb(segs.front());
        // int rmx=segs.front().se;
        // for(int i=1; i<segs.size(); i++)
        // {
        //     pii seg=segs[i];
        //     if(seg.fi>cand.back().se) cand.eb(seg);
        //     else
        //     {
        //         pii _seg=cand.back(); cand.pop_back();
        //         cand.eb(mp(_seg.fi, max(_seg.se, seg.se)));
        //     }
        // }
        cout<<ans1<<" "<<ans2<<endl;
    }
    return 0;
}